#ifndef __ENP_CONFIG_H__
#define __ENP_CONFIG_H__

#include "enpdef.h"

class CZoneKey
{
public:
    CZoneKey()
    {
        Clear();
    }
     
    void Clear()
    {
        _iZoneID = 0;
        _aiWebID.Clear();
    }

    ~CZoneKey()
    {
    }

    int _iZoneID;
    CTArray<int, ENP_MAX_WEB_COUNT> _aiWebID;
};

class CEnpConfig
{
public:
	// 共享内存
	CTSizeString<CT_PATH_MAX>	MgrShmKey;

    CTArray<CZoneKey, ENP_MAX_SHM_QUEUE> ZoneKeyArray;

    // ShmQueue的配置
    int     FrontEndShmSize;   ///< 前端共享内存的大小(这里是共享内存的总大小，单向队列的大小是1/2)
    CTArray<CTSizeString<CT_PATH_MAX>, ENP_MAX_SHM_QUEUE> FrontEndShmKeyArray;
    CTArray<CTSizeString<CT_PATH_MAX>, ENP_MAX_SHM_QUEUE> FrontEndSocketArray;
    CTArray<CTSizeString<CT_PATH_MAX>, ENP_MAX_SHM_QUEUE> BackEndSocketArray;

	// 缓冲区
	int		RecvBufferSize;		///< SOCKET缓冲区大小
    int		SendBufferSize;		///< SOCKET缓冲区大小
	int		BufferCount;	    ///< SOCKET缓冲区个数, Recv和Send的缓冲区都是BufferCount个

	// 连接数
	int		SocketMaxCount;	///< 最大连接数

	// 监听端口信息
    CTArray<CEnpListenInfo, ENP_MAX_LISTEN> ListenArray;

    // 流量控制配置
    int     MaxConnect;              //最大连接数
    int     NewConnCheckInterval;    //新连接创建数量检查时间间隔(微秒)
    int     NewConnMax;              //在NewConnCheckInterval时间内所能接受的最大连接数
    int     SendUpCheckInterval;     //向上层发送的数据包数量检查时间间隔(微秒)
    int     SendUpMax;               //在SendUpCheckInterval时间内向上层所能发送数据包的最大数量
    int     StopAccecptInterval;     //停止接收新连接的时间间隔(秒)

    CTSizeString<MAX_IPLEN>     AdminHost;
    unsigned short              AdminPort;

public:
    void ClearZoneKey();

    int GetIndexByZoneID(int iZoneID);

    int GetIndexByWebID(int iWebID);

	int LoadConfig();

	int ReloadConfig();

	// 读取日志配置
	int LoadLogConfig();
};

/** 全局配置 */
#define CONF    (CTLib::CTSingleton<CEnpConfig, 0>::Instance())

#endif //__ENP_CONFIG_H__
